Hyunjung Im
Frontend Developer
2022-05-07
정렬 알고리즘은 거의 처음으로 생겨난 알고리즘. 즉 정렬은 프로그래밍을 할 때 꼭 필요한 기능이고 정렬이라는 결과를 만드는 방법이 아주 다양하다는 의미입니다.
“classic” 정렬 알고리즘은 매우 간단하므로 알고리즘을 공부하기 위한 훌륭한 출발점이다. 동일한 작업(정렬)에 사용할 수 있는 다양한 알고리즘을 연구하여 worst-case time complexity, average-case time complexity, worst-case extra space, average-case extra space 를 분석하는 방법을 공부할 수 있다.
In Place라는 의미는 원소들을 정렬하는 과정에서 추가적인 공간을 필요로 하지 않고, 이미 할당된 공간 내에서 자리를 바꾸어가며 원소들을 정렬 한다는 의미
정렬 알고리즘에서 Stable은 정렬되지 않은 원소들끼리 정렬 이전과 동일한 상대적인 위치를 그대로 유지한다는 의미. 즉 정렬을 했을 때 중복된 값들의 순서가 정렬 이전과 동일하다면 Stable한 정렬입니다.
거품 정렬 또는 버블 정렬(bubble sort, sinking sort)라고 하고 두 인접한 원소를 검사하여 정렬하는 방법. 시간 복잡도가 O(n^2)로 상당히 느리지만, 코드가 단순하기 때문에 자주 사용됩니다. 원소의 이동이 거품이 수면으로 올라오는 듯한 모습을 보이기 때문에 지어진 이름. 양방향으로 번갈아 수행되면 칵테일 정렬이 됩니다.
procedure bubbleSort( A : list of sortable items ) defined as:
for each i in 1 to length(A) do:
for each j in length(A) downto i + 1 do:
if A[ j ] < A[ j - 1 ] then
swap( A[ j ], A[ j - 1 ] )
end if
end for
end for
end procedure
28 24 27 18
한 번 순회할 때 왼쪽에서 오른쪽으로 두 가지 숫자를 비교하고 큰 수를 오른쪽으로 버블링 되는 것처럼 옮겨간다.
규칙 : 만약에 k
번 순회 한다고 했을 때 오른쪽에서 부터 k
만큼의 요소들이 정렬이 된다
한 번 순회 : O(n)
순회(n)를 n번 반복 -> O(n^2)
Worse Case : O(n^2)
Best Case : O(n)
Auxiliary Space : O(1)
Sorting In Place : Yes
Stable : Yes
데이터가 크면 클수록 느려집니다.
자료 배열의 모든 요소를 앞에서부터 차례대로 이미 정렬된 배열 부분과 비교하여, 자신의 위치를 찾아 삽입함으로써 정렬을 완성하는 알고리즘입니다.
이는 quicksort, heapsort, merge sort와 같은 고급 알고리즘보다 큰 리스트를 다루게 될 땐 훨씬 덜 효율적.
왼쪽으로 오른쪽으로 순회하면서 각 요소를 집어넣습니다. (적절한 위치에)
기존 원소의 왼쪽 에 있는 원소들과 하나씩 비교하여 자리를 찾아가는 과정을 반복하여 데이터를 정렬
i ← 1
while i < length(A)
j ← i
while j > 0 and A[j-1] > A[j]
swap A[j] and A[j-1]
j ← j - 1
end while
i ← i + 1
end while
pivot (기준)을 하나 고른 후, 피벗값보다 작은 원소들을 왼쪽으로 보내고 큰 원소들은 오른쪽으로 보내며 원소들을 다른 파트로 나누어 갑니다.(Partitioning)
Worst Case: O(n^2) (매번 피벗을 가장 큰 값으로 골랐을 떄) Best Case: O(n log n)
단점
장점
merge: 통합하다. 하나의 데이터 리스트를 여러 개로 나누고 다시 병합하며 작은 단위의 정렬을 반복하여 전체의 정렬을 이루어 내는 방식의 정렬 알고리즘
Worst Case: O(n log n) (잘라서 바이너리로 들어가는 건 다 log n) Best Case: O(N log n)
추가 공간이 필요함. 공간 복잡도 : O(n)space
장점
Divide and Conquer